Spatial Planning and Connectivity Corpus - Technical Background Report

IPBES Spatial Planning and Connectivity Assessment

Authors

Rainer M. Krug

Gabriella Bishop

Sebastian Villasante

Doi
Abstract

To Be added

DOI GitHub License: CC BY 4.0

Disclaimer

Contributors

Assessment Experts

  • xxx, yyy ORCID

Data and Knowledge tsu

Working Title

IPBES_SPC_Corpus

Code repo

Github repository

Build No: 144

Introduction

The literature search for the Spatial Planning and Connectivity assessment corpus was conducted using search terms provided by the experts and refined in co-operation with the IPBES task force for data and knowledge management. The search was conducted using OpenAlex, scripted from R to use the OpenAlex API. Search terms for the following searches were defined:

  • Spatial Planning and Connectivity,
  • Nature / Environment
  • additional search terms for specific corpora

To assess the quality of the corpus, sets of key papers were selected by the experts to verify if these are in the corpus.

The following terminology is used in this document:

  • Corpus: A body of works as based on a search on OpenAlex
  • Spatial Planning and Connectivity Assessment Corpus: Short: SPC corpus; The corpus resulting from the search terms TO BE ADDED
  • work: terminology used for a single document in their dataset. Each work has a unique OpenAlex id, but not necesarily a DOI.

The following searches are conducted on Title and Abstract only to account for fluctuating availability of full text searches and make the search more focussed..

Schematic Overview

Overview

flowchart TD
    Start([Start literature search]) --> SPC["spc_corpus.yaml<br/>Assemble base SPC corpus"]
    click SPC "./input/search_terms/spc_corpus.yaml" "Open spc_corpus.yaml"
    SPC --> SPC_list["spc keyword set<br/>(planning & connectivity terms)"]
    SPC --> NATURE_list["nature keyword set<br/>(environmental context terms)"]
    SPC_list --> BaseQuery["Level 1 query<br/>spc terms AND nature dictionary"]
    NATURE_list --> BaseQuery

    BaseQuery --> ChapterSelect{Apply chapter / theme refinements}

    ChapterSelect --> CH1["Chapter 1<br/>chapter_1.v1.yaml<br/>Governance & planning principles"]
    click CH1 "./input/search_terms/chapter_1.v1.yaml" "Open chapter_1.v1.yaml"
    ChapterSelect --> CH2["Chapter 2<br/>chapter_2.yaml + chapter_2_add.yaml + chapter_2_sdg.yaml<br/>GBF targets, nexus themes, SDGs"]
    click CH2 "./input/search_terms/chapter_2.yaml" "Open chapter_2.yaml"
    ChapterSelect --> CH3["Chapter 3<br/>chapter_3.yaml<br/>Restoration & conservation planning"]
    click CH3 "./input/search_terms/chapter_3.yaml" "Open chapter_3.yaml"
    ChapterSelect --> CH4["Chapter 4<br/>chapter_4.yaml<br/>Connectivity evidence & metrics"]
    click CH4 "./input/search_terms/chapter_4.yaml" "Open chapter_4.yaml"
    ChapterSelect --> CH5["Chapter 5<br/>chapter_5_* files<br/>Foresight & futures (sections, themes, cross-cutting)"]
    click CH5 "./input/search_terms/Chapter_5_1_2.yaml" "Open Chapter 5 search terms"
    ChapterSelect --> CH6["Chapter 6<br/>chapter_6.yaml (+ chapter_6_r2.yaml optional)<br/>Enabling environment"]
    click CH6 "./input/search_terms/chapter_6.yaml" "Open chapter_6.yaml"

Chapter 1

flowchart LR
    Start([SPC Corpus]) --> Ch1["chapter_1.v1.yaml<br/>Level 2 refinements"]
    click Ch1 "./input/search_terms/chapter_1.v1.yaml" "Open chapter_1.v1.yaml"

    subgraph Chapter1Sets["Chapter 1 thematic searches"]
        direction TB
        C1_1["Set 1:<br/>land/spatial planning<br/>+ biodiversity goals<br/>+ societal needs/values"]
        C1_2["Set 2:<br/>adaptive/scenario planning<br/>+ monitoring/feedback"]
        C1_3["Set 3:<br/>evidence & precaution<br/>+ ILK knowledge base"]
        C1_4["Set 4:<br/>multilevel/transparent governance<br/>+ customary coherence"]
        C1_5["Set 5:<br/>participatory planning<br/>+ co-design / engagement"]
        C1_6["Set 6:<br/>equity / rights / tenure<br/>+ justice outcomes"]
        C1_7["Set 7:<br/>connectivity (land-sea/cross-scale)<br/>+ nexus & climate links"]
    end

    Ch1 --> C1_1
    Ch1 --> C1_2
    Ch1 --> C1_3
    Ch1 --> C1_4
    Ch1 --> C1_5
    Ch1 --> C1_6
    Ch1 --> C1_7

Search Terms

Click chapter_1.yaml to download

Show the code
params$search_terms$chapter_1 |>
  yaml::as.yaml() |>
  cat()
Set 1:
- ("land use planning" OR "spatial planning") AND
- ("biodiversity goals" OR "ecosystem services") AND
- ("societal needs" OR "value-based planning")
Set 2:
- ("adaptive planning" OR "scenario planning" OR "transformative pathways") AND
- ("monitoring" OR "feedback mechanisms")
Set 3:
- ("evidence-based planning" OR "precautionary principle") AND
- ("Indigenous knowledge" OR "local knowledge" OR "ILK")
Set 4:
- ("multi-level governance" OR "transparent governance" OR "accountable planning")
  AND
- ("customary governance" OR "policy coherence")
Set 5:
- ("participatory planning" OR "community engagement") AND
- ("co-design" OR "stakeholder participation")
Set 6:
- ("equity" OR "rights-based approaches" OR "land tenure") AND
- ("indigenous rights" OR "fairness" OR "just outcomes")
Set 7:
- ("ecological connectivity" OR "land-sea connectivity" OR "cross-scale planning")
  AND
- ("nexus interdependencies" OR "climate-biodiversity linkages")

Chapter 2

flowchart LR
    Start([SPC Corpus]) --> Ch2L2["chapter_2.yaml<br/>Level 2 GBF bundles"]
    click Ch2L2 "../search_terms/chapter_2.yaml" "Open chapter_2.yaml"

    subgraph L1_GBF["GBF contexts & targets"]
        direction TB
        GBF_Urban["GBF-1 Urban"]
        GBF_Rural["GBF-1 Rural"]
        GBF_Fresh["GBF-1 Freshwater"]
        GBF_Marine["GBF-1 Marine"]
        GBF_Restore["GBF-2 Ecosystem restoration"]
        T3["Target 3"]
        T4["Target 4"]
        T5["Target 5"]
        T6["Target 6"]
        T7["Target 7"]
        T8["Target 8"]
        T9["Target 9"]
        T10["Target 10"]
        T11["Target 11"]
        T12["Target 12"]
        T13["Target 13"]
        T14["Target 14"]
        T15["Target 15"]
        T16["Target 16"]
        T17["Target 17"]
        T18["Target 18"]
        T19["Target 19"]
        T20["Target 20"]
        T21["Target 21"]
        T22["Target 22"]
        T23["Target 23"]
        REL["Spatial Planning Related"]
    end
    Ch2L2 --> GBF_Urban
    Ch2L2 --> GBF_Rural
    Ch2L2 --> GBF_Fresh
    Ch2L2 --> GBF_Marine
    Ch2L2 --> GBF_Restore
    Ch2L2 --> T3
    Ch2L2 --> T4
    Ch2L2 --> T5
    Ch2L2 --> T6
    Ch2L2 --> T7
    Ch2L2 --> T8
    Ch2L2 --> T9
    Ch2L2 --> T10
    Ch2L2 --> T11
    Ch2L2 --> T12
    Ch2L2 --> T13
    Ch2L2 --> T14
    Ch2L2 --> T15
    Ch2L2 --> T16
    Ch2L2 --> T17
    Ch2L2 --> T18
    Ch2L2 --> T19
    Ch2L2 --> T20
    Ch2L2 --> T21
    Ch2L2 --> T22
    Ch2L2 --> T23
    Ch2L2 --> REL

    Start --> Ch2L3["chapter_2_add.yaml<br/>Level 3 nexus themes"]
    click Ch2L3 "../search_terms/chapter_2_add.yaml" "Open chapter_2_add.yaml"
    subgraph L1_NexusSets["Nexus add-ons"]
        direction TB
        Nexus_Water["Water"]
        Nexus_Food["Food"]
        Nexus_Health["Health"]
        Nexus_Climate["Climate"]
    end
    Ch2L3 --> Nexus_Water
    Ch2L3 --> Nexus_Food
    Ch2L3 --> Nexus_Health
    Ch2L3 --> Nexus_Climate

    L1_GBF --> Ch2L4["chapter_2_sdg.yaml<br/>Level 4 SDG filters"]
    L1_NexusSets --> Ch2L4
    click Ch2L4 "../search_terms/chapter_2_sdg.yaml" "Open chapter_2_sdg.yaml"
    subgraph SDGSets["SDG goal filters"]
        direction TB
        SDG1["SDG 1"]
        SDG2["SDG 2"]
        SDG3["SDG 3"]
        SDG4["SDG 4"]
        SDG5["SDG 5"]
        SDG6["SDG 6"]
        SDG7["SDG 7"]
        SDG8["SDG 8"]
        SDG9["SDG 9"]
        SDG10["SDG 10"]
        SDG11["SDG 11"]
        SDG12["SDG 12"]
        SDG13["SDG 13"]
        SDG14["SDG 14"]
        SDG15["SDG 15"]
        SDG16["SDG 16"]
        SDG17["SDG 17"]
    end
    Ch2L4 --> SDG1
    Ch2L4 --> SDG2
    Ch2L4 --> SDG3
    Ch2L4 --> SDG4
    Ch2L4 --> SDG5
    Ch2L4 --> SDG6
    Ch2L4 --> SDG7
    Ch2L4 --> SDG8
    Ch2L4 --> SDG9
    Ch2L4 --> SDG10
    Ch2L4 --> SDG11
    Ch2L4 --> SDG12
    Ch2L4 --> SDG13
    Ch2L4 --> SDG14
    Ch2L4 --> SDG15
    Ch2L4 --> SDG16
    Ch2L4 --> SDG17

Search Terms

Click chapter_2.yaml to download

Show the code
params$search_terms$chapter_2 |>
  yaml::as.yaml() |>
  cat()
GBF-1 - Urban:
- '"urban" OR'
- '"city" OR'
- '"periurban" OR'
- '"metropolis"'
GBF-1 - Rural:
- '"rural" OR'
- '"agriculture" OR'
- '"forest" OR'
- '"mountain"'
GBF-1 - Freshwater:
- '"freshwater" OR'
- '"lake" OR'
- '"stream" OR'
- '"current" OR'
- '"river" OR'
- '"wetland" OR'
- '"watershed" OR'
- '"groundwater" OR'
- '"aquifer" OR'
- '"lagoon" OR'
- '"peatland"'
GBF-1 - Marine:
- '"sea" OR'
- '"marine" OR'
- '"ocean" OR'
- '"coast" OR'
- '"mangrove" OR'
- '"seagrass" OR'
- '"saltwater" OR'
- '"brackish water" OR'
- '"tidal flats" OR'
- '"intertidal zone" OR'
- '"subtidal"'
GBF - 2 (Ecosystem restoration):
- '"restoration" OR'
- '"degradation" OR'
- '"regeneration" OR'
- '"ecosystem rehabilitation" OR'
- '"environmental rehabilitation" OR'
- '"rewilding" OR'
- '"abandonment" OR'
- '"let nature do the job" OR'
- '"renaturalization" OR'
- '"reclamation" OR'
- '"conservation" OR'
- '"protection"'
Target 3 (Protected areas / conservation coverage):
- '"protected areas" OR'
- '"conservation" OR'
- '"connectivity" OR'
- '"biodiversity hot spots" OR'
- '"OECMs"'
Target 4 (Species extinction & genetic diversity):
- '"extinction" OR'
- '"human-wildlife conflict" OR'
- '"genetic diversity" OR'
- '"Red List of Threated Species" OR'
- '"Red List of Ecosystems" OR'
- '"RLE"'
Target 5 (Wild species trade & use):
- '"Wildlife trade" OR'
- '"harvesting" OR'
- '"overexploitation" OR'
- '"poaching" OR'
- '"CITES"'
Target 6 (Invasive alien species):
- '"invasive species" OR'
- '"alien species" OR'
- '"IAS"'
Target 7 (Pollution):
- '"pollution" OR'
- '"nutrient runoff" OR'
- '"excess nutrients" OR'
- '"pesticide" OR'
- '"plastic" OR'
- '"PFAS" OR'
- '"forever chemicals" OR'
- '"contamination" OR'
- '"eutrophication" OR'
- '"industrial liquid waste" OR'
- '"solid waste" OR'
- '"waste" OR'
- '"saline intrusion"'
Target 8 (Climate change & resilience):
- '"climate change" OR'
- '"resilience" OR'
- '"nature-based solutions" OR'
- '"ocean acidification"'
Target 9 (Wild species management & use):
- '"wild species management" OR'
- '"sustainable use of wild species" OR'
- '"indigenous people" OR'
- '"IPLC" OR'
- '"community-based management"'
Target 10 (Sustainability in agriculture, aquaculture, forestry & fisheries):
- '"agriculture" OR'
- '"agroecology" OR'
- '"forestry" OR'
- '"fisheries aquaculture" OR'
- '"land use management" OR'
- '"water use management" OR'
- '"recreational fisheries"'
Target 11 (Nature’s contributions to people / ecosystem services):
- '"ecosystem services" OR'
- '"nature’s contributions to people" OR'
- '"NCP" OR'
- '"people’s contributions to nature"'
Target 12 (Green & blue spaces, urban planning):
- '"green space" OR'
- '"blue space" OR'
- '"urban planning" OR'
- '"green infrastructure" OR'
- '"blue infrastructure" OR'
- '"green areas"'
Target 13 (Genetic resources & benefit sharing):
- '"genetic resources" OR'
- '"benefit sharing" OR'
- '"ILK" OR'
- '"traditional knowledge" OR'
- '"Nagoya protocol"'
Target 14 (Biodiversity integration in decision-making):
- '"biodiversity policy" OR'
- '"environmental impact assessment" OR'
- '"EIA" OR'
- '"strategic environmental assessment" OR'
- '"SEA" OR'
- '"biodiversity valuation" OR'
- '"biodiversity action"'
Target 15 (Business & financial institutions disclosure & risk):
- '"company" OR'
- '"corporate responsibility" OR'
- '"business" OR'
- '"supply chain" OR'
- '"corporate biodiversity reporting" OR'
- '"social responsibility" OR'
- '"investment"'
Target 16 (Sustainable consumption):
- '"sustainable consumption" OR'
- '"waste" OR'
- '"footprint"'
Target 17 (Biosafety):
- '"biosafety" OR'
- '"biotechnology" OR'
- '"GMO" OR'
- '"genetically modified organisms"'
Target 18 (Harmful incentives / subsidies):
- '"subsidies" OR'
- '"incentives" OR'
- '"PES" OR'
- '"payments for ecosystem services"'
Target 19 (Finance mobilisation):
- '"finance mobilization" OR'
- '"funding" OR'
- '"private sector" OR'
- '"biodiversity investments"'
Target 20 (Capacity building, technology & cooperation):
- '"capacity building" OR'
- '"education" OR'
- '"technology" OR'
- '"cooperation" OR'
- '"innovation"'
Target 21 (Data, knowledge & monitoring):
- '"data governance" OR'
- '"monitoring" OR'
- '"research" OR'
- '"evaluation"'
Target 22 (Participation & inclusion):
- '"indigenous peoples" OR'
- '"ILK" OR'
- '"local communities" OR'
- '"youth" OR'
- '"participatory governance" OR'
- '"minority" OR'
- '"procedural justice" OR'
- '"non-human" OR'
- '"women" OR'
- '"girls" OR'
- '"rights" OR'
- '"defender" OR'
- '"activist" OR'
- '"guardian"'
Target 23 (Gender equality):
- '"gender" OR'
- '"women" OR'
- '"woman" OR'
- '"girls"'
Related to spatial planning process:
- '"planning phases" OR'
- '"planning stages" OR'
- '"planning steps" OR'
- '"planning cycle" OR'
- '"policy formulation" OR'
- '"decision-making" OR'
- '"local planning practices of indigenous people" OR'
- '"traditional practices of indigenous people" OR'
- '"planning guidelines"'

Non implemented additional searches are:

Chapter 3

flowchart LR
    Start([SPC Corpus]) --> Ch3["chapter_3.yaml<br/>Level 2 refinements"]
    click Ch3 "./input/search_terms/chapter_3.yaml" "Open chapter_3.yaml"

    subgraph Chapter3Sets["Chapter 3 searches"]
        direction TB
        C3_1["Set 1:<br/>Protected/OECM + NBSAP + cases<br/>+ spatial prioritization + regional scales"]
        C3_2["Set 2:<br/>Restoration types + inclusivity & ILK"]
        C3_3["Set 3:<br/>Restoration planning + connectivity + resilience"]
        C3_4["Set 4:<br/>Systematic conservation planning / gap analysis"]
        C3_5["Set 5:<br/>Protected area & connectivity planning"]
        C3_6["Set 6:<br/>Landscape/species/corridor networks"]
        C3_7["Set 7:<br/>Conservation planning + ecosystem services"]
        C3_8["Set 8:<br/>Participatory conservation mapping"]
        C3_9["Set 9:<br/>Conservation effectiveness + spatial planning"]
        C3_10["Set 10:<br/>Adaptive management under global change drivers"]
    end
    Ch3 --> C3_1
    Ch3 --> C3_2
    Ch3 --> C3_3
    Ch3 --> C3_4
    Ch3 --> C3_5
    Ch3 --> C3_6
    Ch3 --> C3_7
    Ch3 --> C3_8
    Ch3 --> C3_9
    Ch3 --> C3_10

Search Terms

Click chapter_3.yaml to download

Show the code
params$search_terms$chapter_3 |>
  yaml::as.yaml() |>
  cat()
Set 1:
- ((protected OR conserved) AND areas) OR "OECM" OR "other effective area-based conservation
  measures" OR "ITT" OR "indigenous and traditional territories") AND
- ("NBSAP" OR (national AND ("Biodiversity Strategy" OR target)) OR "downscaling")
  AND
- ("case study" OR "best practice" OR "planning" OR "spatial prioritization") AND
- ("regional" OR "national" OR "subnational" OR "mountain" OR "marine" OR (Indigenous
  AND ("land" OR "protected areas")) OR transboundary)
Set 2:
- '"restoration" AND'
- ("inclusivity" OR "participation" OR "co-management" OR "Indigenous knowledge" OR
  "traditional ecological knowledge" OR "ILK" OR "local knowledge" OR "community-based
  restoration" OR "stakeholder engagement" OR "social equity" OR "justice" OR "gender
  inclusion")
Set 3:
- ("restoration planning" OR "ecological restoration") AND
- ("ecosystem integrity" OR "ecological connectivity" OR "corridors" OR "migration
  pathways" OR "climate resilience" OR "participatory approaches")
Set 4: ("spatial conservation planning" OR "landscape conservation planning" OR "conservation
  gap analysis" OR "systematic conservation planning" OR "ecoregion conservation"
  OR "transboundary conservation planning")
Set 5: ("protected area planning" OR "protected area connectivity planning" OR "conservation
  priority areas" OR "marine protected area planning")
Set 6: ("landscape connectivity and conservation" OR "species connectivity" OR "planning
  conservation network" OR "ecological connectivity planning" OR "conservation corridor
  planning" OR "network conservation planning" OR "marine conservation planning" OR
  "seascape conservation planning" OR "wetland conservation planning")
Set 7: ("conservation planning" AND "ecosystem services")
Set 8: ("participatory conservation mapping" OR "community conservation mapping" OR
  "participatory spatial planning")
Set 9:
- ("conservation effectiveness" OR "protected area management effectiveness") AND
- '"spatial planning"'
Set 10:
- '"adaptive management" AND'
- ("global change" OR "climate change" OR "land use change" OR "sea use change" OR
  "invasive species" OR "overexploitation" OR "pollution") AND
- '"spatial planning"'

Chapter 4

flowchart LR
    Start([SPC Corpus]) --> Ch4["chapter_4.yaml<br/>Level 2 refinements"]
    click Ch4 "./input/search_terms/chapter_4.yaml" "Open chapter_4.yaml"

    subgraph Chapter4Sets["Chapter 4 searches"]
        direction TB
        C4_1["Set 1:<br/>Connectivity review articles"]
        C4_2["Set 2:<br/>Connectivity benefits vs risks<br/>+ ecosystem services"]
        C4_3["Set 3:<br/>Structural vs functional connectivity"]
        C4_4["Set 4:<br/>Connectivity modelling toolkits"]
        C4_5["Set 5:<br/>Connectivity indicators & metrics"]
        C4_6["Set 6:<br/>Policy & governance integration"]
        C4_7["Set 7:<br/>Multilevel / transboundary governance<br/>+ IPLC inclusion + land tenure"]
        C4_8["Set 8:<br/>Movement ecology<br/>(dispersal / migration / permeability)"]
    end
    Ch4 --> C4_1
    Ch4 --> C4_2
    Ch4 --> C4_3
    Ch4 --> C4_4
    Ch4 --> C4_5
    Ch4 --> C4_6
    Ch4 --> C4_7
    Ch4 --> C4_8

Search Terms

Click chapter_4.yaml to download

Show the code
params$search_terms$chapter_4 |>
  yaml::as.yaml() |>
  cat()
Set 1: '"ecological connectivity"'
Set 2: ("ecological connectivity" OR "habitat connectivity" OR "landscape connectivity"
  OR "wildlife corridor" OR "biological corridor") AND ("benefits" OR "advantages"
  OR "positive" OR "impacts" OR "opportunities") AND ("risks" OR "drawbacks" OR "negative"
  OR "impacts" OR "challenges") AND ("ecosystem services" OR "ecosystem management")
Set 3:
- '"structural connectivity" OR'
- '"functional connectivity"'
Set 4:
- '"connectivity analysis" OR'
- '"network analysis" OR'
- '"circuit theory" OR'
- '"least-cost path" OR'
- '"graph theory" OR'
- '"resistant kernels" OR'
- '"agent-based models" OR'
- '"Conefor" OR'
- '"pattern-oriented model" OR'
- '"state-space model" OR'
- '"corridor model" OR'
- '"simulated individual" OR'
- '"movement paths" OR'
- '"hidden Markov models" OR'
- '"effective connectivity" OR'
- '"gene flow"'
Set 5: '"ecological connectivity" AND ("indicator" OR "index" OR "metric*" OR "objective")'
Set 6:
- ("ecological connectivity" OR "landscape connectivity" OR "functional connectivity"
  OR "connectivity conservation") AND
- ("policy" OR "framework" OR "governance" OR "planning instrument" OR "initiative"
  OR "agreement" OR "global" OR "international" OR "regional strategy" OR "transboundary
  cooperation" OR "joint management" OR "cross-border conservation" OR "bioregional
  planning")
Set 7:
- ("ecological connectivity" OR "spatial governance") AND
- ("multi-level governance" OR "cross-scale governance" OR "transboundary governance")
  AND
- ("inclusive governance" OR "community-based management" OR "co-management") AND
- ("Indigenous Peoples" OR "Local Communities" OR "IPLCs") AND
- ("policy coherence" OR "cross-sectoral integration") AND
- ("land tenure" OR "property rights" OR "private land conservation")
Set 8:
- '"dispersal" OR'
- '"migration" OR'
- '"nomadism" OR'
- '"landscape permeability"'

Chapter 5

flowchart LR
    Start([SPC Corpus]) --> Ch5L2["Chapter_5_1_2.yaml<br/>Level 2 foresight framing"]
    click Ch5L2 "./input/search_terms/Chapter_5_1_2.yaml" "Open Chapter_5_1_2.yaml"

    subgraph L2Sets["Section 5.1–5.2 searches"]
        direction TB
        C5_1["Set 1:<br/>Future + project*/predict*/scenario"]
        C5_2["Set 2:<br/>Future + pathway*/narrative*/vision*"]
        C5_3["Set 3:<br/>Future-proof*/anticipat*/scenario planning"]
        C5_4["Set 4:<br/>Foresight*/backcasting/simulat*/trend*"]
        C5_5["Set 5:<br/>Model* AND scenario"]
    end
    Ch5L2 --> C5_1
    Ch5L2 --> C5_2
    Ch5L2 --> C5_3
    Ch5L2 --> C5_4
    Ch5L2 --> C5_5

    Start --> Ch5L3["chapter_5_3.yaml<br/>Level 3 – Drivers of change"]
    click Ch5L3 "./input/search_terms/chapter_5_3.yaml" "Open chapter_5_3.yaml"
    subgraph L3Sets["Section 5.3 searches"]
        direction TB
        C5_3a["Set 1:<br/>Drivers of change"]
        C5_3b["Set 2:<br/>Driver modelling approaches"]
        C5_3c["Set 3:<br/>Driver gaps"]
    end
    Ch5L3 --> C5_3a
    Ch5L3 --> C5_3b
    Ch5L3 --> C5_3c

    Start --> Ch5L4["chapter_5_4.yaml<br/>Level 4 – Synergies & trade-offs"]
    click Ch5L4 "./input/search_terms/chapter_5_4.yaml" "Open chapter_5_4.yaml"
    subgraph L4Sets["Section 5.4 searches"]
        direction TB
        C5_4a["Set 1:<br/>Interactions (synergy/trade-off/nexus)"]
        C5_4b["Set 2:<br/>Response options (integrated planning / NbS)"]
        C5_4c["Set 3:<br/>Cross-scale synergy & trade-off terms"]
    end
    Ch5L4 --> C5_4a
    Ch5L4 --> C5_4b
    Ch5L4 --> C5_4c

    Start --> Ch5L5["chapter_5_5.yaml<br/>Level 5 – Uncertainty & risk"]
    click Ch5L5 "./input/search_terms/chapter_5_5.yaml" "Open chapter_5_5.yaml"
    subgraph L5Sets["Section 5.5 searches"]
        direction TB
        C5_5a["Set 1:<br/>Adaptive / transformative management"]
        C5_5b["Set 2:<br/>Uncertainty quantification"]
        C5_5c["Set 3:<br/>Tipping points & thresholds"]
        C5_5d["Set 4:<br/>Cascading risks & precaution"]
    end
    Ch5L5 --> C5_5a
    Ch5L5 --> C5_5b
    Ch5L5 --> C5_5c
    Ch5L5 --> C5_5d

    Start --> Ch5L6["chapter_5_6.yaml<br/>Level 6 – Knowledge to action"]
    click Ch5L6 "./input/search_terms/chapter_5_6.yaml" "Open chapter_5_6.yaml"
    subgraph L6Sets["Section 5.6 searches"]
        direction TB
        C5_6a["Set 1:<br/>Science-policy-practice pathways"]
        C5_6b["Set 2:<br/>ILK integration & community planning"]
        C5_6c["Set 3:<br/>Enabling factors & coordination"]
        C5_6d["Set 4:<br/>Shocks, surprises, uncertainties"]
    end
    Ch5L6 --> C5_6a
    Ch5L6 --> C5_6b
    Ch5L6 --> C5_6c
    Ch5L6 --> C5_6d

    Start --> Ch5CC["chapter_5_cc.yaml<br/>Cross-cutting themes"]
    click Ch5CC "./input/search_terms/chapter_5_cc.yaml" "Open chapter_5_cc.yaml"
    subgraph CCSets["Cross-cutting searches"]
        direction TB
        CC1["Set 1:<br/>Scales & telecoupling"]
        CC2["Set 2:<br/>Co-production & inclusion"]
    end
    Ch5CC --> CC1
    Ch5CC --> CC2

Search Terms

Click chapter_5.yaml to download

Show the code
params$search_terms$chapter_5 |>
  yaml::as.yaml() |>
  cat()
Sections 1 and 2:
  Set 1: Future AND (projection OR projected OR predicted OR prediction OR forecast
    OR scenario)
  Set 2: Future AND (pathway OR narrative OR storyline OR foresight OR vision OR horizon
    scan OR trajectory OR imagination)
  Set 3:
  - '"future-proof" OR'
  - anticipate OR
  - '"forward-looking" OR'
  - '"futures thinking" OR'
  - '"future-oriented" OR'
  - '"prospective" OR'
  - '"plausible future" OR'
  - '"scenario planning"'
  Set 4:
  - Foresight OR
  - backcasting OR
  - simulate OR
  - simulation OR
  - '"delphi method" OR'
  - storytelling OR
  - '"environmental scan" OR'
  - trend OR
  - megatrend
  Set 5: (model AND scenario)
Section 3:
  Set 1:
  - '"drivers of change" OR'
  - '"biodiversity driver" OR'
  - '"social-ecological driver" OR'
  - '"technological driver" OR'
  - '"perennial driver" OR'
  - '"emerging driver" OR'
  - '"cascading driver"'
  Set 2:
  - '"Integrated assessment" OR'
  - '"land-use change model" OR'
  - '"Scenario model" OR'
  - '"Social-ecological model" OR'
  - agent-based model" OR
  - '"telecoupled systems model" OR'
  - '"hybrid model" OR'
  - '"participatory model" OR'
  - '"data-driven foresight model"'
  Set 3:
  - '"value-based driver" OR'
  - '"compound driver" OR'
  - '"interacting driver" OR'
  - '"distant driver"'
Section 4:
  Set 1:
  - Synergy OR
  - tradeoff OR
  - trade-off OR
  - nexus OR
  - win-win OR
  - '"cross-sectoral interaction" OR'
  - co-benefit
  Set 2:
  - '"Integrated planning" OR'
  - '"multifunctional" OR'
  - '"nature-based solution" OR'
  - '"adaptive governance" OR'
  - '"cross-sectoral governance"'
  Set 3:
  - Spatial OR
  - temporal OR
  - thematic OR
  - cross-scale) AND (Synergy OR
  - tradeoff OR
  - '"trade-off" OR'
  - nexus OR
  - '"win-win"'
Section 5:
  Set 1:
  - '"Adaptative management" OR'
  - '"Adaptative governance" OR'
  - '"Transformative adaptation" OR'
  - '"Adaptive systems" OR'
  - '"Adaptive foresight"'
  Set 2:
  - (Model OR
  - data OR
  - '"decision-making under" OR'
  - planning OR
  - scenario OR
  - epistemic OR
  - ontological) AND uncertainty
  Set 3:
  - '"Tipping points" OR'
  - hresholds OR
  - '"Planetary boundaries" OR'
  - '"Nonlinear system dynamics" OR'
  - Surprise
  Set 4:
  - '"Cascading risk" OR'
  - '"Risk management" OR'
  - '"Environmental shocks" OR'
  - '"Environmental risks" OR'
  - '"Precautionary approach"'
Section 6:
  Set 1:
  - '"Science-policy-practice" OR'
  - '"transformative pathways" OR'
  - '"transdisciplinary co-production"'
  Set 2:
  - '"Knowledge co-production" OR'
  - '"community-based spatial planning" OR'
  - '"indigenous mapping" OR'
  - '"traditional knowledge" OR'
  - '"participatory scenario planning"'
  Set 3:
  - '"Multi-level governance" OR'
  - '"institutional capacity" OR'
  - '"cross-sectoral coordination"'
  Set 4:
  - '"Planning for uncertainty" OR'
  - '"adaptive planning" OR'
  - '"resilience planning" OR'
  - '"anticipatory governance"'
Cross-cutting sets:
  Set 1: ("Spatial scaling" OR "Temporal scaling" OR "Social scale" OR "Nested governance"
    OR "Multi-scale planning" OR "Cross-scale interaction" OR Telecoupling OR Teleconnection
    OR Metacoupling OR Spillover)
  Set 2:
  - '"Indigenous and Local Knowledge" OR'
  - ILK "Co-production of knowledge" OR
  - '"pluralism" OR'
  - epistemic OR
  - '"Community-based natural resource management" OR'
  - CBNRM OR
  - Biocultural OR
  - '"Traditional ecological knowledge" OR'
  - TEK OR
  - '"Customary governance" OR'
  - '"tenure systems" OR'
  - '"Participatory mapping" OR'
  - '"Cross-cultural" OR'
  - '"knowledge integration" OR'
  - ((Gender OR Social) AND Inclusion) OR
  - '"Gender-responsive" OR'
  - '"Intersectionality" OR'
  - equity OR
  - '"Women’s roles" OR'
  - '"Gendered" OR'
  - '"Empowerment" OR'
  - '"capacity-building"'

Chapter 6

flowchart LR
    Start([SPC Corpus]) --> Ch6["chapter_6.yaml<br/>Level 2 refinements"]
    click Ch6 "./input/search_terms/chapter_6.yaml" "Open chapter_6.yaml"

    subgraph Chapter6Sets["Chapter 6 searches"]
        direction TB
        C6_1["Set 1:<br/>Institutional & governance structures"]
        C6_2["Set 2:<br/>Political & strategic leadership"]
        C6_3["Set 3:<br/>Socio-cultural & stakeholder engagement"]
        C6_4["Set 4:<br/>Collaboration, trust & networks"]
        C6_5["Set 5:<br/>Financial & economic mechanisms"]
        C6_6["Set 6:<br/>Legal & policy frameworks"]
        C6_7["Set 7:<br/>Human & institutional capacity"]
        C6_8["Set 8:<br/>Data, knowledge & decision support"]
        C6_9["Set 9:<br/>Ecological & spatial planning tools"]
        C6_10["Set 10:<br/>Cross-cutting process enablers"]
    end
    Ch6 --> C6_1
    Ch6 --> C6_2
    Ch6 --> C6_3
    Ch6 --> C6_4
    Ch6 --> C6_5
    Ch6 --> C6_6
    Ch6 --> C6_7
    Ch6 --> C6_8
    Ch6 --> C6_9
    Ch6 --> C6_10

Ch6R2["chapter_6_r2.yaml<br/>Optional Level 3 filter"]
Chapter6Sets --> Ch6R2
click Ch6R2 "./input/search_terms/chapter_6_r2.yaml" "Open chapter_6_r2.yaml"
subgraph Chapter6Case["Chapter 6 searches"]
    R2["Case-study keywords<br/>(case stud*, example*, initiative*, etc.)"]
end
Ch6R2 --> R2

Search Terms

Click chapter_6.yaml to download

Show the code
params$search_terms$chapter_6 |>
  yaml::as.yaml() |>
  cat()
Set 1:
- '"institutional arrangements" OR'
- '"governance structures" OR'
- '"cross-sector coordination" OR'
- '"multi-level governance" OR'
- '"inter-agency collaboration" OR'
- '"policy coherence" OR'
- '"environmental governance" OR'
- '"landscape governance" OR'
- '"seascape governance" OR'
- '"integrated landscape management"'
Set 2:
- ("political support" OR
- '"environmental leadership" OR'
- '"ministerial alignment" OR'
- '"strategic prioritization" OR'
- '"national biodiversity strategy"'
Set 3:
- '"stakeholder engagement" OR'
- participation OR'
- '"co-design" OR'
- '"co-production" OR'
- '"community-based management" OR'
- '"indigenous governance" OR'
- '"traditional knowledge" OR'
- '"Free Prior and Informed Consent" OR'
- FPIC OR
- '"stakeholder workshops" OR'
- '"stakeholder dialogues" OR'
- '"public consultation"'
Set 4:
- (collaboration OR
- trust OR'
- partnership OR'
- '"multi-stakeholder platform" OR'
- coalition OR'
- '"inter-organizational network" OR'
- cooperation
Set 5:
- ("biodiversity finance" OR
- '"blended finance" OR'
- '"green finance" OR'
- '"conservation trust funds" OR'
- '"Payment of ecosystem services" OR'
- '"natural capital accounting" OR'
- '"biodiversity offsets")'
Set 6:
- ("environmental law" OR
- legislation OR
- '"statutory framework" OR'
- '"policy instruments" OR'
- '"regulatory mechanisms" OR'
- '"strategic environmental assessment" OR'
- '"Environmental Impact Assessment"'
Set 7:
- '"institutional capacity" OR'
- '"technical expertise" OR'
- '"capacity building" OR'
- training OR
- '"professional development" OR'
- '"institutional strengthening" OR'
- '"workforce development" OR'
- education OR
- pipeline OR
- '"diversity and inclusion" OR'
- '"gender inequality" OR'
- '"girl''s education" OR'
- '"Indigenous knowledge" OR'
- '"generational knowledge" OR'
- '"institutional memory")'
Set 8.1:
- '"species distribution maps" OR'
- (("land cover" OR "protected area") AND data) OR
- '"Indigenous knowledge" OR'
- '"knowledge co-production" OR'
- '"knowledge and data management" OR'
- '"spatial data infrastructure" OR'
- ((CARE OR FAIR) AND principles) OR
- '"open science" OR'
- '"information delivery" OR'
- (data AND (standards OR stewardship OR "management plan" OR "sharing agreement"
  OR archive OR repository OR structure)) OR
- metadata OR
- (quality AND (assurance OR control))
Set 8.2:
- '"monitoring and evaluation" OR'
- '"decision-support tools" OR'
- '"ecological model" OR'
- '"scenario planning and analysis" OR'
- ("systematic conservation planning" AND ("and model" OR tools)) OR
- '"biodiversity targets" OR'
- '"science communication" OR'
- '"science-practice gap" OR'
- '"participatory mapping and model" OR'
- '"scenario narratives" OR'
- '"evidence bridge" OR'
- '"boundary spanner and organization" OR'
- '"early adopter" OR'
Set 9:
- '"spatial planning" OR'
- '"landscape governance" OR'
- '"territorial integration" OR'
- '"land-use planning" OR'
- '"ecological connectivity" OR'
- '"ecological networks" OR'
- '"ecological corridors" OR'
- '"green infrastructure" OR'
- '"nature-based Strategic spatial planning solutions" OR'
- '"restoration planning" OR'
- '"blue infrastructure" OR'
- '"blue-green infrastructure" OR'
- '"spatial decision-making" OR'
- '"strategic spatial planning"'
Set 10:
- '"adaptive management" OR'
- '"feedback mechanisms" OR'
- '"monitoring and learning" OR'
- '"institutional innovation" OR'
- '"continuous improvement"'

Non implemented additional searches are:

Type Selsection

OpenAlex contains more then 270 million works of different types. The following table shows and explains the available types and highlights which are selected to be included in the SPC Corpus.

Show the code
params$types |>
  knitr::kable(
    caption = "OpenAlex Work Types and Inclusion in the SPC Corpus",
    booktabs = TRUE,
    align = c("l", "l", "l", "c")
  ) # |>
OpenAlex Work Types and Inclusion in the SPC Corpus
Type Description Included
article Scholarly journal articles and related periodical works TRUE
book Monographs and other long-form published books TRUE
book-chapter Chapters published within edited books or proceedings TRUE
dissertation Doctoral or master level theses and dissertations TRUE
editorial Editorials and editor introductions TRUE
preprint Pre-publication manuscripts shared prior to peer review TRUE
report Technical, institutional, or policy reports TRUE
review Narrative or systematic review articles TRUE
dataset Published datasets and structured data releases FALSE
erratum Published corrections to previously released works FALSE
grant Summaries or descriptions of grant-funded projects FALSE
letter Correspondence, commentaries, and short letters FALSE
libguides Library research guides and curated bibliographies FALSE
other Works that do not align with a more specific OpenAlex type FALSE
paratext Prefaces, introductions, indexes, and other paratextual items FALSE
peer-review Formal peer review reports and evaluations FALSE
reference-entry Encyclopaedia or dictionary reference entries FALSE
retraction Notices retracting previously published works FALSE
standard Standards, protocols, and technical specifications FALSE
supplementary-materials Supplementary files accompanying primary publications FALSE
Show the code
# kableExtra::kable_styling(
#     full_width = FALSE,
#     position = "left"
# )

Methods

SPC Corpus

Assess of Individual Terms in spc and nature search terms

This assessment is done on the whole of the OpenAlex corpus and only filtered for types and not for the date range.

Show the code
fn <- file.path(params$output_dir, "searchterm_assessment_spcc.rds")

if (!file.exists(fn)) {
  result <- list(
    spc = assess_search_term_both(
      st = params$search_terms$spc_corpus$spc,
      and_term = stcompact(params$search_terms$spc_corpus$spc_corpus$nature),
      types = params$types_filter,
      verbose = TRUE
    ),
    nature = assess_search_term_both(
      st = params$search_terms$spc_corpus$nature,
      and_term = stcompact(params$search_terms$spc_corpus$spc_corpus$spc),
      types = params$types_filter,
      verbose = FALSE
    )
  ) |>
    saveRDS(fn)
}

Get Key Paper

Here we get key papers in a parquet database which is partitioned by:

  • found_in: the search term or openalex which is used as the filter, i.e. the key paper occurs in corpus which would result from the search term
  • id_used: the id used to testing,m either the OpenAlex id (id) or the doi (doi)
  • page: only for processing reasons

No filtering, neither by type nor by publication year is done.

The other columns are as returned by the OpenAlex API.

Show the code
#|

st <- list(
  spc = params$search_terms$spc_corpus$spc |>
    paste0(collapse = " "),
  nature = params$search_terms$spc_corpus$nature |>
    paste0(collapse = " ")
)
st$spcc <- paste0("(", st$spc, ") AND (", st$nature, ")")

dois <- params$key_papers$goldstandard$DOI[
  params$key_papers$goldstandard$DOI != ""
]
ids <- params$key_papers$goldstandard$openalex_id[
  params$key_papers$goldstandard$openalex_id != ""
]
Show the code
#|

fn <- file.path(params$keyworks, "parquet", "found_in=openalex")
if (!dir.exists(fn)) {
  ### KP in OpenAlex
  openalexPro::pro_query(
    doi = dois,
    chunk_limit = 50
  ) |>
    openalexPro::pro_request(
      output = file.path(fn, "..", "json_doi")
    ) |>
    openalexPro::pro_request_jsonl(
      output = file.path(fn, "..", "jsonl_doi"),
      delete_input = TRUE
    ) |>
    openalexPro::pro_request_jsonl_parquet(
      output = file.path(fn, "id_used=doi"),
      delete_input = TRUE
    )

  openalexPro::pro_query(
    id = ids,
    multiple_id = TRUE,
    chunk_limit = 50
  ) |>
    openalexPro::pro_request(
      output = file.path(fn, "..", "json_oa_id")
    ) |>
    openalexPro::pro_request_jsonl(
      output = file.path(fn, "..", "jsonl_oa_id"),
      delete_input = TRUE
    ) |>
    openalexPro::pro_request_jsonl_parquet(
      output = file.path(fn, "id_used=oa_id"),
      delete_input = TRUE
    )
}
Show the code
#|

fn <- file.path(params$keyworks, "parquet", "found_in=spc")
if (!dir.exists(fn)) {
  openalexPro::pro_query(
    title_and_abstract.search = st$spc,
    doi = dois,
    chunk_limit = 25
  ) |>
    openalexPro::pro_request(
      output = file.path(fn, "..", "json_doi")
    ) |>
    openalexPro::pro_request_jsonl(
      output = file.path(fn, "..", "jsonl_doi"),
      delete_input = TRUE
    ) |>
    openalexPro::pro_request_jsonl_parquet(
      output = file.path(fn, "id_used=doi"),
      delete_input = TRUE
    )

  openalexPro::pro_query(
    title_and_abstract.search = st$spc,
    id = ids,
    multiple_id = TRUE,
    chunk_limit = 25
  ) |>
    openalexPro::pro_request(output = file.path(fn, "json_oa_id")) |>
    openalexPro::pro_request_jsonl(
      output = file.path(fn, "jsonl_oa_id"),
      delete_input = TRUE
    ) |>
    openalexPro::pro_request_jsonl_parquet(
      output = file.path(fn, "id_used=oa_id"),
      delete_input = TRUE
    )
}
Show the code
#|

fn <- file.path(params$keyworks, "parquet", "found_in=nature")
if (!dir.exists(fn)) {
  ### KP in nature
  openalexPro::pro_query(
    title_and_abstract.search = st$nature,
    doi = dois,
    chunk_limit = 25
  ) |>
    openalexPro::pro_request(output = file.path(fn, "json_doi")) |>
    openalexPro::pro_request_jsonl(
      output = file.path(fn, "jsonl_doi"),
      delete_input = TRUE
    ) |>
    openalexPro::pro_request_jsonl_parquet(
      output = file.path(fn, "id_used=doi"),
      delete_input = TRUE
    )

  openalexPro::pro_query(
    title_and_abstract.search = st$nature,
    id = ids,
    multiple_id = TRUE,
    chunk_limit = 25
  ) |>
    openalexPro::pro_request(output = file.path(fn, "json_oa_id")) |>
    openalexPro::pro_request_jsonl(
      output = file.path(fn, "jsonl_oa_id"),
      delete_input = TRUE
    ) |>
    openalexPro::pro_request_jsonl_parquet(
      output = file.path(fn, "id_used=oa_id"),
      delete_input = TRUE
    )
}
Show the code
#|

fn <- file.path(params$keyworks, "parquet", "found_in=spcc")
if (!dir.exists(fn)) {
  ### KP in spcc
  openalexPro::pro_query(
    title_and_abstract.search = st$spcc,
    doi = params$key_papers$goldstandard$DOI[
      params$key_papers$goldstandard$DOI != ""
    ],
    chunk_limit = 15
  ) |>
    openalexPro::pro_request(output = file.path(fn, "json_doi")) |>
    openalexPro::pro_request_jsonl(
      output = file.path(fn, "jsonl_doi"),
      delete_input = TRUE
    ) |>
    openalexPro::pro_request_jsonl_parquet(
      output = file.path(fn, "id_used=doi"),
      delete_input = TRUE
    )

  openalexPro::pro_query(
    title_and_abstract.search = st$spcc,
    id = params$key_papers$goldstandard$openalex_id[
      params$key_papers$goldstandard$openalex_id != ""
    ],
    multiple_id = TRUE,
    chunk_limit = 25
  ) |>
    openalexPro::pro_request(output = file.path(fn, "json_oa_id")) |>
    openalexPro::pro_request_jsonl(
      output = file.path(fn, "jsonl_oa_id"),
      delete_input = TRUE
    ) |>
    openalexPro::pro_request_jsonl_parquet(
      output = file.path(fn, "id_used=oa_id"),
      delete_input = TRUE
    )
}

Keypaper in Search Terms

The in the previous step retrieved works are analysed here to get a table which shows where the key paper occur.

Show the code
fn <- file.path(params$keyworks, "kp_found_in.rds")
if (!file.exists(fn)) {
  arrow::open_dataset(file.path(params$keyworks, "parquet")) |>
    dplyr::select(
      id,
      doi,
      type,
      found_in,
      title,
      citation
    ) |>
    dplyr::group_by(id, doi, title, citation, type) |>
    dplyr::summarise(
      in_openalex = base::max(found_in == "openalex", na.rm = TRUE),
      in_spc = base::max(found_in == "spc", na.rm = TRUE),
      in_nature = base::max(found_in == "nature", na.rm = TRUE),
      in_spcc = base::max(found_in == "spcc", na.rm = TRUE),
      .groups = "drop"
    ) |>
    dplyr::collect() |>
    saveRDS(fn)
}

Get Numbers from OpenAlex of the Search Terms

These data is gathered from OpenAlex directly, not downloaded any works. The data is used to assess the quality of the TCA Corpus.

The query contains: - the search term (nature, spc, spcc) - the types selected (article, book, book-chapter, dissertation, editorial, preprint, report, review) - the date range (from 1992-01-01 to 2025-12-31)

The following counts are retrieved:

Overall hits

Show the code
#|

fn <- file.path(params$corpus, "st_hits.rds")
if (!file.exists(fn)) {
  st <- list(
    spc = params$search_terms$spc_corpus$spc |>
      paste0(collapse = " "),
    nature = params$search_terms$spc_corpus$nature |>
      paste0(collapse = " ")
  )
  st$spcc <- paste0("(", st$spc, ") AND (", st$nature, ")")

  queries <- lapply(
    st,
    function(s) {
      openalexPro::pro_query(
        title_and_abstract.search = s,
        type = params$types_filter,
        from_publication_date = params$publication_date$from,
        to_publication_date = params$publication_date$to
      )
    }
  )
  queries$openalex <- openalexPro::pro_query(
    type = params$types_filter,
    from_publication_date = params$publication_date$from,
    to_publication_date = params$publication_date$to,
  )

  pbapply::pblapply(
    queries,
    function(query) {
      query |>
        openalexR::oa_request(
          count_only = TRUE,
          verbose = TRUE
        ) |>
        unlist()
    }
  ) |>
    do.call(what = cbind) |>
    t() |>
    as.data.frame() |>
    dplyr::select(count) |>
    saveRDS(file = fn)
}

Counts per Language

Show the code
#|

fn <- file.path(params$corpus, "st_languages.rds")
if (!file.exists(fn)) {
  st <- list(
    spc = params$search_terms$spc_corpus$spc |>
      paste0(collapse = " "),
    nature = params$search_terms$spc_corpus$nature |>
      paste0(collapse = " ")
  )
  st$spcc <- paste0("(", st$spc, ") AND (", st$nature, ")")

  queries <- lapply(
    st,
    function(s) {
      openalexPro::pro_query(
        title_and_abstract.search = s,
        type = params$types_filter,
        from_publication_date = params$publication_date$from,
        to_publication_date = params$publication_date$to,
        group_by = "language"
      )
    }
  )
  queries$openalex <- openalexPro::pro_query(
    type = params$types_filter,
    from_publication_date = params$publication_date$from,
    to_publication_date = params$publication_date$to,
    group_by = "language"
  )

  pbapply::pblapply(
    queries,
    function(query) {
      query |>
        openalexR::oa_request(
          verbose = TRUE
        ) |>
        dplyr::bind_rows()
    }
  ) |>
    dplyr::bind_rows(.id = "source") |>
    dplyr::select(source, language = key_display_name, count) |>
    tidyr::pivot_wider(
      names_from = source,
      values_from = count,
      names_prefix = "count_",
      values_fill = 0
    ) |>
    dplyr::select(
      language,
      count_openalex,
      count_spc,
      count_nature,
      count_spcc
    ) |>
    dplyr::arrange(language) |>
    saveRDS(file = fn)
}

Counts per Publication Year

Show the code
fn <- file.path(params$corpus, "st_years.rds")
if (!file.exists(fn)) {
  st <- list(
    spc = params$search_terms$spc_corpus$spc |>
      paste0(collapse = " "),
    nature = params$search_terms$spc_corpus$nature |>
      paste0(collapse = " ")
  )
  st$spcc <- paste0("(", st$spc, ") AND (", st$nature, ")")

  queries <- lapply(
    st,
    function(s) {
      openalexPro::pro_query(
        title_and_abstract.search = s,
        type = params$types_filter,
        from_publication_date = params$publication_date$from,
        to_publication_date = params$publication_date$to,
        group_by = "publication_year"
      )
    }
  )
  queries$openalex <- openalexPro::pro_query(
    type = params$types_filter,
    from_publication_date = params$publication_date$from,
    to_publication_date = params$publication_date$to,
    group_by = "publication_year"
  )

  result <- pbapply::pblapply(
    queries,
    function(query) {
      query |>
        openalexR::oa_request(
          verbose = TRUE
        ) |>
        dplyr::bind_rows()
    }
  ) |>
    dplyr::bind_rows(.id = "source") |>
    dplyr::select(source, year = key, count) |>
    dplyr::mutate(year = base::as.integer(year)) |>
    tidyr::pivot_wider(
      names_from = source,
      values_from = count,
      names_prefix = "count_",
      values_fill = 0
    ) |>
    dplyr::select(
      year,
      count_openalex,
      count_spc,
      count_nature,
      count_spcc
    ) |>
    dplyr::arrange(dplyr::desc(year)) |>
    saveRDS(file = fn)
}

Chapter 1

Show the code
# params$search_terms$chapter_1

fn <- file.path(params$chapter_1, "st_hits.rds")
if (!file.exists(fn)) {
  spcc <- paste0(
    "(",
    stcompact(params$search_terms$spc_corpus$spc),
    ") AND (",
    stcompact(params$search_terms$spc_corpus$nature),
    ")"
  )
  queries <- lapply(
    params$search_terms$chapter_1,
    function(s) {
      openalexPro::pro_query(
        title_and_abstract.search = paste0(
          "(",
          spcc,
          ") AND (",
          stcompact(s),
          ")"
        ),
        type = params$types_filter,
        from_publication_date = params$publication_date$from,
        to_publication_date = params$publication_date$to
      )
    }
  )

  result <- pbapply::pblapply(
    queries,
    function(query) {
      query |>
        openalexR::oa_request(
          count_only = TRUE,
          verbose = TRUE
        ) |>
        unlist()
    }
  ) |>
    do.call(what = cbind) |>
    t() |>
    as.data.frame() |>
    dplyr::select(count)

  rownames(result) <- names(queries)
  saveRDS(result, file = fn)
}

Chapter 2

Show the code
fn <- file.path(params$chapter_2, "st_hits.rds")
if (!file.exists(fn)) {
  spcc <- paste0(
    "(",
    stcompact(params$search_terms$spc_corpus$spc),
    ") AND (",
    stcompact(params$search_terms$spc_corpus$nature),
    ")"
  )
  queries <- lapply(
    params$search_terms$chapter_2,
    function(s) {
      openalexPro::pro_query(
        title_and_abstract.search = paste0(
          "(",
          spcc,
          ") AND (",
          stcompact(s),
          ")"
        ),
        type = params$types_filter,
        from_publication_date = params$publication_date$from,
        to_publication_date = params$publication_date$to
      )
    }
  )

  result <- pbapply::pblapply(
    queries,
    function(query) {
      query |>
        openalexR::oa_request(
          count_only = TRUE,
          verbose = TRUE
        ) |>
        unlist()
    }
  ) |>
    do.call(what = cbind) |>
    t() |>
    as.data.frame() |>
    dplyr::select(count)

  rownames(result) <- names(queries)
  saveRDS(result, file = fn)
}

Chapter 3

Show the code
fn <- file.path(params$chapter_3, "st_hits.rds")
if (!file.exists(fn)) {
  spcc <- paste0(
    "(",
    stcompact(params$search_terms$spc_corpus$spc),
    ") AND (",
    stcompact(params$search_terms$spc_corpus$nature),
    ")"
  )
  queries <- lapply(
    params$search_terms$chapter_3,
    function(s) {
      result <- c(
        count = NA_integer_,
        db_response_time_ms = NA_integer_,
        page = NA_integer_,
        per_page = NA_integer_
      )
      try(
        result <- openalexPro::pro_query(
          title_and_abstract.search = paste0(
            "(",
            spcc,
            ") AND (",
            stcompact(s),
            ")"
          ),
          type = params$types_filter,
          from_publication_date = params$publication_date$from,
          to_publication_date = params$publication_date$to
        ),
        silent = FALSE
      )
    }
  )

  result <- pbapply::pblapply(
    queries,
    function(query) {
      result <- c(
        count = NA_integer_,
        db_response_time_ms = NA_integer_,
        page = NA_integer_,
        per_page = NA_integer_
      )
      try(
        result <- query |>
          openalexR::oa_request(
            count_only = TRUE,
            verbose = TRUE
          ) |>
          unlist()
      )
    }
  ) |>
    do.call(what = cbind) |>
    t() |>
    as.data.frame() |>
    dplyr::select(count)
  rownames(result) <- names(queries)
  saveRDS(result, file = fn)
}

Chapter 4

Show the code
fn <- file.path(params$chapter_4, "st_hits.rds")
if (!file.exists(fn)) {
  spcc <- paste0(
    "(",
    stcompact(params$search_terms$spc_corpus$spc),
    ") AND (",
    stcompact(params$search_terms$spc_corpus$nature),
    ")"
  )
  queries <- lapply(
    params$search_terms$chapter_4,
    function(s) {
      openalexPro::pro_query(
        title_and_abstract.search = paste0(
          "(",
          spcc,
          ") AND (",
          stcompact(s),
          ")"
        ),
        type = params$types_filter,
        from_publication_date = params$publication_date$from,
        to_publication_date = params$publication_date$to
      )
    }
  )

  result <- pbapply::pblapply(
    queries,
    function(query) {
      query |>
        openalexR::oa_request(
          count_only = TRUE,
          verbose = TRUE
        ) |>
        unlist()
    }
  ) |>
    do.call(what = cbind) |>
    t() |>
    as.data.frame() |>
    dplyr::select(count)
  rownames(result) <- names(queries)
  saveRDS(result, file = fn)
}

Chapter 5

Show the code
fn <- file.path(params$chapter_5, "st_hits.rds")
if (!file.exists(fn)) {
  spcc <- paste0(
    "(",
    stcompact(params$search_terms$spc_corpus$spc),
    ") AND (",
    stcompact(params$search_terms$spc_corpus$nature),
    ")"
  ) |>
    stcompact()

  queries <- lapply(
    params$search_terms$chapter_5,
    function(section) {
      lapply(
        section,
        function(s) {
          openalexPro::pro_query(
            title_and_abstract.search = paste0(
              "(",
              spcc,
              ") AND (",
              stcompact(s),
              ")"
            ),
            type = params$types_filter,
            from_publication_date = params$publication_date$from,
            to_publication_date = params$publication_date$to
          )
        }
      )
    }
  )

  result <- lapply(
    names(queries),
    function(sect_nm) {
      result <- lapply(
        names(queries[[sect_nm]]),
        function(nm) {
          message("Retrieving ", sect_nm, " - ", nm, " ...")
          result <- c(
            count = NA_integer_,
            db_response_time_ms = NA_integer_,
            page = NA_integer_,
            per_page = NA_integer_
          )
          try(
            result <- queries[[sect_nm]][nm] |>
              openalexR::oa_request(
                count_only = TRUE,
                verbose = TRUE
              ) |>
              unlist(),
            silent = FALSE
          )
          return(result)
        }
      ) |>
        do.call(what = cbind) |>
        t() |>
        as.data.frame() |>
        dplyr::select(count)
      browser()
      rownames(result) <- names(queries[[sect_nm]])
      return(result)
    }
  )
  names(result) <- names(queries)

  saveRDS(result, file = fn)
}

Chapter 6

Show the code
fn <- file.path(params$chapter_6, "st_hits.rds")
if (!file.exists(fn)) {
  spcc <- paste0(
    "(",
    stcompact(params$search_terms$spc_corpus$spc),
    ") AND (",
    stcompact(params$search_terms$spc_corpus$nature),
    ")"
  )
  queries <- lapply(
    params$search_terms$chapter_6,
    function(s) {
      openalexPro::pro_query(
        title_and_abstract.search = paste0(
          "(",
          spcc,
          ") AND (",
          stcompact(s),
          ")"
        ),
        type = params$types_filter,
        from_publication_date = params$publication_date$from,
        to_publication_date = params$publication_date$to
      )
    }
  )

  pbapply::pblapply(
    queries,
    function(query) {
      query |>
        openalexR::oa_request(
          count_only = TRUE,
          verbose = TRUE
        ) |>
        unlist()
    }
  ) |>
    do.call(what = cbind) |>
    t() |>
    as.data.frame() |>
    dplyr::select(count) |>
    saveRDS(file = fn)
}

Results

Assessment of Search Terms

The individual terms are assessed with the second term as AND, e,g. each individual term in spc is assessed with AND nature. In addition,

SPC Term

Show the code
readRDS(file.path(params$output, "searchterm_assessment_spcc.rds"))$spc |>
  dplyr::arrange(desc(count)) |>
  dplyr::mutate(
    count = format(count, big.mark = ","),
    count_excl = format(count_excl, big.mark = ","),
  ) |>
  knitr::kable(format = "html", escape = FALSE)
term count count_excl
(planning AND ("for ecosystem services" OR process OR scenario OR tools)) 1,017,423 628,024
(scenario AND (analysis OR "based model" OR "based planning" OR building OR planning OR thinking OR "and models" OR "of land use")) 823,278 573,185
(spatial AND (composition OR configuration OR "conservation prioritisation" OR "conservation prioritization" OR decision OR development OR "forest planning" OR governance OR planning OR prioritisation OR prioritization OR transformation)) 602,935 436,652
((anticipatory OR "community based" OR "forest management" OR "land-sea" OR participatory OR "place based" OR regional OR sectorial OR territorial OR urban OR "agricultural management") AND planning) 570,408 288,519
connectivity 462,139 421,368
restoration 461,619 414,289
(land AND (allocation OR governance OR system)) 307,390 197,052
(adaptive AND (management OR planning)) 301,145 197,302
(conservation AND (practice OR planning OR program OR strategy)) 224,366 135,032
(("key biodiversity" OR protected OR "remote ocean") AND areas) 221,855 164,550
(landscape AND (complexity OR planning OR governance OR management OR "ecological planning")) 188,346 90,574
("land use" AND (decision OR planning OR governance OR management OR model OR scenario OR trade-offs OR tradeoffs)) 175,850 61,655
((integrative OR "trends and") AND scenarios) 158,117 44,536
(animal AND (migration OR movement)) 69,706 59,441
((functional OR working) AND landscapes) 57,339 33,481
(("cumulative impact" OR "environmental impact" OR "strategic environmental") AND assessment) 53,084 39,875
(ecological AND (corridor OR networks)) 48,519 28,884
zoning 47,515 34,093
"systems integration" 45,455 39,570
(biodiversity AND (assessment OR indicators OR scenario)) 42,921 18,889
((blue OR green) AND infrastructure) 34,269 21,585
("ecosystem service" AND (mapping OR model OR planning)) 23,168 5,931
((inclusive OR marine) AND governance) 22,749 14,562
"stepping stones" 15,426 13,470
(nature AND ("based solutions" OR futures)) 15,054 10,569
(integrated AND ("assessment framework" OR "assessment model" OR "coastal zone management")) 9,036 5,538
((habitat OR wildlife) AND corridor) 7,994 2,480
(("ecosystem based" OR "sea use") AND management) 5,703 2,990
"multi-criteria decision analysis" 5,573 4,066
rewilding 2,050 1,416
(("generalized dissimilarity" OR macroecological) AND model) 1,051 657
IPBES 1,013 577
"reserve design" 640 315
"futures thinking" 555 389
OECM 325 201
"critical areas for biodiversity" 17 7

Nature Term

Show the code
readRDS(file.path(params$output, "searchterm_assessment_spcc.rds"))$nature |>
  dplyr::arrange(desc(count)) |>
  dplyr::mutate(
    count = format(count, big.mark = ","),
    count_excl = format(count_excl, big.mark = ","),
  ) |>
  knitr::kable(format = "html", escape = FALSE)
term count count_excl
environment 5,632,294 4,172,455
species 3,617,601 2,255,946
nature 3,237,894 2,486,614
sustainable 2,906,151 2,074,119
soil 1,902,093 1,251,249
sea 1,252,202 754,245
forest 1,056,992 528,914
river 1,014,650 577,104
ecological 895,466 307,577
landscape 887,347 517,493
conservation 828,328 372,154
Earth 817,275 536,522
ecosystem 758,588 204,392
marine 733,422 345,840
ocean 638,702 316,168
habitat 527,015 129,262
lake 503,207 292,207
restoration 461,619 310,828
mountain 436,976 226,941
coast 405,171 186,642
biodiversity 274,406 49,100
terrestrial 250,351 89,767
flora 203,682 106,753
planet 198,955 107,487
freshwater 197,798 68,708
fauna 177,810 54,757
maritime 165,601 100,574
plantation 156,309 74,683
desert 148,335 80,539
wetland 142,831 55,476
wildlife 140,485 44,419
grassland 115,642 31,839
estuary 91,809 30,857
bog 63,988 47,337
marshes 62,280 27,317
"protected areas" 58,841 10,644
"natural resource" 57,732 23,487
"agricultural land" 52,850 19,782
meadow 50,143 15,742
woodland 48,902 13,753
biosphere 42,288 11,840
"coastal waters" 32,475 10,837
savanna 28,074 8,952
"coupled system" 24,968 20,591
dryland 24,512 9,887
peatland 20,500 8,522
"arable land" 18,039 4,739
mires 17,492 11,468
tundra 17,271 4,697
fjord 13,078 5,981
shrubland 9,561 1,172
bioeconomy 8,454 4,201
"resource system" 4,988 2,907
seascape 4,305 1,134
heathland 3,324 833
marshland 3,313 898
chaparral 2,663 1,168
"environmental resource" 2,073 736
agroforest 1,499 322
"agro-forest" 479 0

Keypaper in Corpus

No filtering, neither by type nor by publication year is done. Therefore, the pure search terms are evaluated. If a paper is included in this table, doex not mean it is included in the final SPC Corpus due to filtering by dates and types!

Show the code
readRDS(file.path(params$keyworks, "kp_found_in.rds")) |>
  dplyr::mutate(
    id_display = sub("^.*/(W[0-9]+)$", "\\1", id),
    id = sprintf("<a href=\"%s\" target=\"_blank\">%s</a>", id, id_display),
    doi_display = sub("^https://doi.org/", "\\1", doi),
    doi = sprintf("<a href=\"%s\" target=\"_blank\">%s</a>", doi, doi_display)
  ) |>
  dplyr::arrange(
    in_spcc,
    in_spc,
    in_nature,
    in_openalex
  ) |>
  dplyr::mutate(
    dplyr::across(
      dplyr::starts_with("in_"),
      ~ dplyr::case_when(
        .x ~ '<b style="color:#008000;">☑</b>', # green bold checkbox
        !.x ~ '<b style="color:#cc0000;">☐</b>' # red bold empty checkbox
      )
    )
  ) |>
  dplyr::select(
    id,
    doi,
    citation,
    in_spcc,
    in_spc,
    in_nature,
    in_openalex
  ) |>
  knitr::kable(format = "html", escape = FALSE)
id doi citation in_spcc in_spc in_nature in_openalex
W2086673960 10.1016/j.tree.2009.04.008 William J. Sutherland & Harry J. Woodroof (2009)
W4233598570 10.1146/annurev-anthro-102218-011435 David Valentine & Amelia Hassoun (2019)
W2056591496 10.1016/s0016-3287(98)00101-3 Richard A. Slaughter (1998)
W2090312322 10.1016/j.futures.2007.11.010 Joseph Voros (2007)
W1992974326 10.1016/j.futures.2007.11.011 Richard A. Slaughter (2007)
W2795786882 10.1007/s00267-018-1028-3 Ida N.S. Djenontin & Alison M. Meadow (2018)
W2128217744 10.1177/0306312713508669 David H. Guston (2013)
W1973628253 10.1016/j.enpol.2005.12.006 Will McDowall & Malcolm Eames (2006)
W3170399214 10.1016/j.mex.2021.101401 Daniel Beiderbeck et al. (2021)
W2964311550 10.1016/j.techfore.2019.07.002 Ian Belton et al. (2019)
W2015646994 10.1016/j.tree.2014.07.005 Carly N. Cook et al. (2014)
W4238224782 10.1016/j.futures.2015.08.007 I. Milojević & Sohail Inayatullah (2015)
W4298615974 10.1007/s10980-022-01534-5 Tom Harwood et al. (2022)
W4414957974 10.1073/pnas.2501695122 Damaris Zurell et al. (2025)
W4210765186 10.1038/s41893-021-00844-x Roslyn Henry et al. (2022)
W1990241575 10.1007/s10021-004-0074-2 Paul Raskin (2005)
W2904898541 10.1007/s10668-018-00300-5 Azime Tezer et al. (2018)
W4407294089 10.1080/02697459.2025.2459975 Romina Rodela (2025)
W2910481941 10.1080/02513625.2018.1562795 Peter Schmitt & Thorsten Wiechmann (2018)
W2116090915 10.1016/j.futures.2012.10.003 Muhammad Amer et al. (2012)
W2057938345 10.1108/14636680810855991 Sohail Inayatullah (2008)
W4386609980 10.1038/s43588-023-00503-5 Yu Zheng et al. (2023)
W2971398159 10.1111/rec.13035 George D. Gann et al. (2019)
W2114666631 10.1525/bio.2010.60.3.7 Timothy J. Beechie et al. (2010)
W4395447577 10.1126/science.adn3441 Henrique M. Pereira et al. (2024)
W2062482344 10.1073/pnas.1201040109 Joshua Goldstein et al. (2012)
W1540682446 10.1111/brv.12008 Aija S. Kukkala & Atte Moilanen (2012)
W2015619301 10.1073/pnas.1000530107 Lian Pin Koh & Jaboury Ghazoul (2010)
W3126018057 10.1111/rec.13346 Jordi Cortina et al. (2021)
W3161819570 10.1126/science.abc4896 Louise O’Connor et al. (2021)
W4212886831 10.1111/geb.13459 Karel Mokany et al. (2022)
W2952896657 10.5194/gmd-11-4537-2018 Hyejin Kim et al. (2018)
W3151200781 10.1111/rec.13403 Ben L. Gilby et al. (2021)
W3185562566 10.1038/d41586-021-02041-4 Georgina G. Gurney et al. (2021)
W3074014079 10.1007/s10113-020-01685-8 Clara J. Veerkamp et al. (2020)
W4382751812 10.1016/j.biocon.2023.110068 Marcel Kok et al. (2023)
W4406904698 10.1016/j.tree.2024.12.002 Sylvaine Giakoumi et al. (2025)
W4382181311 10.1007/s11625-023-01316-1 América Paz Durán et al. (2023)
W2769947232 10.1016/j.cosust.2017.10.004 Jean Paul Metzger et al. (2017)
W2614376759 10.1016/j.envsci.2017.05.003 Vanessa M. Adams et al. (2017)
W3145276257 10.1016/j.jenvman.2021.112400 Yuyoung Choi et al. (2021)
W3044450114 10.1016/j.envsoft.2020.104806 Andrew J. Hoskins et al. (2020)
W2972648221 10.1111/1365-2664.13506 Karel Mokany et al. (2019)
W2255223904 NA Bob Scholes (2010)
W2978599153 NA Peter H. Verburg et al. (2019)
W1963746476 10.1016/j.ecocom.2009.10.006 R.S. de Groot et al. (2009)
W4211243502 10.1038/35012251 Chris Margules & Robert L. Pressey (2000)
W2759207970 10.3390/su9091668 Leena Karrasch et al. (2017)
W4297536966 10.1016/j.tree.2022.09.002 Maria Beger et al. (2022)
W3159060995 10.1016/j.ecoser.2021.101273 Karsten Grunewald et al. (2021)
W2487200415 10.1016/j.marpol.2016.06.023 Elianny Domínguez-Tejo et al. (2016)
W2956763155 10.1088/1748-9326/ab3234 Annika T. H. Keeley et al. (2019)
W3200717663 10.1007/s10980-021-01329-0 Jianquan Dong et al. (2021)
W4313593374 10.1016/j.mex.2022.101989 Holly Kirk et al. (2023)
W4387055605 10.1038/s44183-023-00022-w Julie Reimer et al. (2023)
W3100416804 10.1111/1365-2664.13796 Virgilio Hermoso et al. (2020)
W3215595594 10.1093/biosci/biab091 Abigail J. Lynch et al. (2021)
W4393866290 10.3390/su16072965 Qiqi Hu et al. (2024)
W2554309037 10.1111/btp.12386 Agnieszka E. Latawiec et al. (2016)
W3209482460 10.25607/obp-1666 Alejandro Iglesias-Campos et al. (2021)
W4320016094 10.1007/978-3-031-15773-8_4 Falko Buschke et al. (2023)
W4295308933 10.1073/pnas.2203385119 Natalia Estrada-Carmona et al. (2022)
W4412257196 10.5281/zenodo.6522392 Unai Pascual et al. (2022)
W4415164578 10.1098/rsos.250810 Rachael Garrett et al. (2025)
W2766457534 10.1016/j.landusepol.2017.10.017 Chiara Cortinovis & Davide Geneletti (2017)
W2035832288 10.1007/s10980-014-0085-0 Christian Albert et al. (2014)
W2046569818 10.1007/s10980-014-0052-9 Christine Fürst et al. (2014)
W3134065015 10.1016/j.envsci.2021.02.001 Davide Longato et al. (2021)
W2902345284 10.1007/s10980-018-0745-6 Marcin Spyra et al. (2018)
W2771003204 10.1080/21513732.2017.1396257 Christine Fürst et al. (2017)
W2999493939 10.1016/j.landurbplan.2019.103741 Christian Albert et al. (2020)
W4211108983 10.1007/978-3-030-20024-4 Davide Geneletti et al. (2019)
W3158973852 10.1016/j.landurbplan.2021.104129 Chiara Cortinovis et al. (2021)
W2604803374 10.1093/biosci/bix012 Charles H. Nilon et al. (2017)
W2612157793 10.1016/j.marpol.2017.06.020 Mara Ntona & Elisa Morgera (2017)
W2592317409 10.1080/21513732.2017.1296494 Justice Nana Inkoom et al. (2017)
W2810876831 10.3897/rio.4.e28045 Evelyn Underwood et al. (2018)
W4392293717 10.1016/j.ecolind.2024.111816 Wen Song et al. (2024)
W4289516997 10.1007/s41207-022-00315-5 Georgia Pozoukidou et al. (2022)
W4376627395 10.1016/j.marpol.2023.105655 Julie Reimer et al. (2023)
W2804302736 10.1016/j.scitotenv.2018.05.147 Maria da Luz Fernandes et al. (2018)
W4406477943 10.1007/s11252-024-01656-5 Israa H. Mahmoud et al. (2025)
W4404646473 10.1007/s00267-024-02086-x Nina Farwig et al. (2024)
W4220936177 10.1016/j.oneear.2022.02.008 Christopher M. Raymond et al. (2022)
W1966247992 10.1080/21513732.2011.617711 Davide Geneletti (2011)
W2027491594 10.1016/j.ecolind.2015.03.029 Christian Albert et al. (2015)
W2918948909 10.1016/j.gecco.2019.e00569 Arieanna C. Balbar & Anna Meta×as (2019)
W3194313759 10.1007/978-94-024-1681-7 Christina von Haaren et al. (2019)
W4281717750 10.1126/science.abl8974 Angela Brennan et al. (2022)
W2265414043 10.1146/annurev.ecolsys.32.081501.114012 Steward T. A. Pickett et al. (2001)
W2099188808 10.1016/j.landurbplan.2006.04.005 Jolande W. Termorshuizen et al. (2006)
W2884329716 10.1007/978-3-319-94021-2 László Miklós & Anna Špinerová (2018)
W2766942546 10.1080/08920753.2017.1373450 Kekuewa Kikiloi et al. (2017)
W4409833817 10.1126/science.adn2225 Jedediah F. Brodie et al. (2025)
W2524916285 10.1002/aqc.2645 Alan M. Friedlander et al. (2016)
W4413900892 10.1016/j.tree.2025.07.014 Jian Peng et al. (2025)
W4410629764 10.1016/j.rsma.2025.104257 Liisi Lees et al. (2025)
W4412750811 10.1016/j.marpol.2025.106852 Jean‐Eudes Beuret et al. (2025)
W3021127236 10.1016/j.marpol.2020.103950 Thomas Robertson et al. (2020)
W3132073286 10.1016/j.biocon.2021.109008 Annika T. H. Keeley et al. (2021)
W2783683111 10.1016/j.biocon.2017.12.020 Santiago Saura et al. (2018)
W1880093763 10.1111/ecog.01507 Rafael A. Magris et al. (2015)
W2965201645 10.1016/j.biocon.2019.07.028 Santiago Saura et al. (2019)
W3085078608 10.1038/s41467-020-18457-x Michelle Ward et al. (2020)
W4390696637 10.1038/s41467-023-43832-9 Rachel Neugarten et al. (2024)
W2791599583 10.1111/conl.12439 Rafael A. Magris et al. (2018)
W4302293680 10.1111/csp2.12823 David M. Theobald et al. (2022)
W4392367143 10.1111/brv.13066 Steven J. Cooke et al. (2024)
W1990273831 10.1126/science.1242552 Silke Bauer & Bethany J. Hoye (2014)
W4280541891 10.3389/fevo.2022.830822 Sylvia Wood et al. (2022)
W4402144060 10.1002/ece3.70231 Amanda Liczner et al. (2024)
W2784805535 10.1126/science.aam9712 Marlee A. Tucker et al. (2018)
W4410131928 10.3354/meps14888 Susanne E. Tanner et al. (2025)
W4412704230 10.1073/pnas.2410937122 Robin Naidoo et al. (2025)
W4414925393 10.1016/j.tree.2025.09.007 Sandra Neubert et al. (2025)
W4413449508 10.1038/s41467-025-63205-8 Jedediah F. Brodie et al. (2025)
W4415240687 10.1007/s10980-025-02210-0 Tamsin L. Woodman et al. (2025)
W3085006993 10.1002/pan3.10146 Laura Pereira et al. (2020)
W2093445010 10.1126/science.1258832 Jianguo Liu et al. (2015)
W2754686867 10.1038/s41559-017-0273-9 Isabel M.D. Rosa et al. (2017)
W4210386268 10.1016/j.envsci.2022.01.013 Andressa V. Mansur et al. (2022)
W4380362703 10.1016/j.gloenvcha.2023.102681 Hyejin Kim et al. (2023)
W2122104680 10.1111/j.1523-1739.2009.01212.x William J. Sutherland et al. (2009)
W4310004272 10.1007/s11625-022-01251-7 Lucas Rutting et al. (2022)
W2023339029 10.1046/j.1523-1739.2003.01491.x Garry Peterson et al. (2003)
W2470861343 10.1016/j.landurbplan.2016.05.003 Adrienne Grêt‐Regamey et al. (2016)
W2161139387 10.1126/science.1196624 Henrique M. Pereira et al. (2010)
W56780107 10.1007/978-1-4612-0529-6_10 Jack Ahern (1999)
W2028797766 10.1016/j.cosust.2013.05.002 Ralf Seppelt et al. (2013)
W2073677603 10.1016/j.biocon.2015.02.015 Sebastián Martinuzzi et al. (2015)
W2156111479 10.1111/gcb.12383 Sebastián Martinuzzi et al. (2013)
W2159760863 10.1111/j.1466-8238.2010.00620.x Joachim H. Spangenberg et al. (2011)
W2902463689 10.1016/j.tree.2018.10.006 Emily Nicholson et al. (2018)
W4406487214 10.1007/s10980-024-02042-4 Jiangxiao Qiu et al. (2025)
W4386734502 10.1146/annurev-environ-112321-095011 Steven J. Cork et al. (2023)
W4411717980 10.1007/s11625-025-01682-y Sana Okayasu et al. (2025)

SPC Corpus Measures and Numbers

These data is gathered from OpenAlex directly, not downloaded any works. The data is used to assess the quality of the TCA Corpus.

The query contains: - the search term (nature, spc, spcc) - the types selected (article, book, book-chapter, dissertation, editorial, preprint, report, review) - the date range (from 1992-01-01 to 2025-12-31)

Overall counts

Show the code
readRDS(file.path(params$corpus, "st_hits.rds")) |>
  dplyr::mutate(
    count = format(count, big.mark = ",")
  ) |>
  knitr::kable(format = "html", escape = FALSE)
count
spc 4,544,896
nature 20,190,014
spcc 2,222,660
openalex 206,460,611

Publication Years

Show the code
readRDS(file.path(params$corpus, "st_years.rds")) |>
  dplyr::mutate(
    dplyr::across(
      dplyr::starts_with("count_"),
      ~ base::format(.x, big.mark = ",")
    )
  ) |>
  knitr::kable(format = "html", escape = FALSE)
year count_openalex count_spc count_nature count_spcc
2025 6,420,626 273,419 978,363 155,857
2024 8,674,641 345,127 1,266,418 184,392
2023 8,739,761 336,234 1,234,151 167,947
2022 7,788,681 286,123 1,094,807 140,820
2021 8,727,643 289,333 1,116,533 139,639
2020 9,568,568 275,318 1,089,309 131,477
2019 9,310,221 234,540 980,962 110,164
2018 9,088,473 213,304 910,063 100,205
2017 9,036,675 194,774 846,656 90,810
2016 9,224,129 188,191 824,310 88,226
2015 8,995,985 184,977 815,544 87,345
2014 8,903,164 180,966 819,526 86,341
2013 8,629,370 171,218 790,682 81,682
2012 8,166,378 156,660 741,057 75,505
2011 7,898,188 146,247 695,949 70,195
2010 7,364,809 132,283 651,250 63,836
2009 6,892,603 116,426 586,391 55,996
2008 6,377,808 104,273 526,908 49,988
2007 5,927,263 91,643 481,201 44,084
2006 5,589,069 85,042 447,247 40,651
2005 5,120,011 75,497 405,003 36,301
2004 4,687,457 65,745 363,326 32,031
2003 4,356,577 59,871 335,473 28,914
2002 4,165,066 58,792 327,551 27,727
2001 3,574,319 42,436 260,637 20,957
2000 3,406,507 38,877 247,241 19,022
1999 2,957,510 32,717 207,594 15,799
1998 2,820,046 29,628 195,172 14,253
1997 2,690,097 27,101 183,111 12,912
1996 2,561,558 25,911 177,286 12,025
1995 2,385,412 23,621 163,938 11,050
1994 2,248,172 21,395 150,111 9,807
1993 2,132,198 19,446 143,413 8,709
1992 2,030,588 17,709 132,692 7,962

This graph only shows the relative nuymber of publications per year to identify different trends.

Show the code
readRDS(file.path(params$corpus, "st_years.rds")) |>
  tidyr::pivot_longer(
    cols = dplyr::starts_with("count_"),
    names_to = "source",
    values_to = "count",
    names_prefix = "count_"
  ) |>
  # scale each source so its total sum is 1
  dplyr::group_by(source) |>
  dplyr::mutate(
    total_count = base::sum(count, na.rm = TRUE),
    count = dplyr::if_else(total_count > 0, count / total_count, 0)
  ) |>
  dplyr::ungroup() |>
  dplyr::select(-total_count) |>
  ggplot2::ggplot(ggplot2::aes(x = year, y = count, color = source)) +
  ggplot2::geom_line(linewidth = 1) +
  ggplot2::geom_point(size = 1.5) +
  ggplot2::scale_y_continuous(
    labels = scales::label_percent(accuracy = 1),
    expand = ggplot2::expansion(mult = c(0.02, 0.06))
  ) +
  ggplot2::labs(
    x = "Year",
    y = "Share of total works (sum-scaled per source)",
    color = "Source",
    title = "Publications per year by source (each source sums to 1)"
  ) +
  ggplot2::theme_minimal(base_size = 14) +
  ggplot2::theme(
    legend.position = "bottom",
    panel.grid.minor = ggplot2::element_blank()
  )

Language

Show the code
readRDS(file.path(params$corpus, "st_languages.rds")) |>
  dplyr::mutate(
    dplyr::across(
      dplyr::starts_with("count_"),
      ~ base::format(.x, big.mark = ",")
    )
  ) |>
  knitr::kable(format = "html", escape = FALSE)
language count_openalex count_spc count_nature count_spcc
Afrikaans 152,123 186 1,882 85
Albanian 13,464 5 159 3
Arabic 630,430 739 4,004 316
Bengali 2,832 5 59 4
Bulgarian 52,174 119 805 61
Catalan 548,935 1,377 9,246 660
Chinese 4,515,849 620 9,036 275
Croatian 327,780 571 5,455 234
Czech 411,692 148 1,491 86
Danish 272,416 215 4,474 54
Dutch 760,616 718 6,092 223
English 147,308,044 4,416,922 19,355,336 2,172,710
Estonian 107,485 111 1,519 60
Finnish 172,606 175 1,183 59
French 5,684,250 19,314 194,328 7,894
German 5,128,381 5,530 25,179 1,709
Gujarati 433 0 3 0
Hebrew 3,854 24 82 13
Hindi 10,149 2 27 0
Hungarian 132,449 546 2,705 263
Indonesian 3,067,380 30,752 131,047 10,633
Italian 1,486,223 2,463 15,222 1,276
Japanese 6,356,692 1,253 10,635 448
Kannada 384 0 0 0
Korean 3,773,900 1,502 12,173 555
Latvian 25,370 13 126 8
Lithuanian 96,020 362 1,198 189
Macedonian 27,123 48 215 14
Malayalam 308 0 14 0
Marathi 2,225 1 8 1
Modern Greek (1453-) 139,939 186 1,219 71
Nepali (macrolanguage) 3,418 6 59 3
Norwegian 252,703 141 2,124 35
Panjabi 118 0 1 0
Persian 493,321 192 2,037 75
Polish 1,119,250 604 5,556 251
Portuguese 3,994,572 7,623 52,263 4,053
Romanian 259,646 252 3,857 115
Russian 2,267,881 11,190 50,518 5,522
Slovak 51,264 38 283 18
Slovenian 104,130 189 1,298 98
Somali 19,603 6 77 4
Spanish 7,152,552 33,041 208,085 11,536
Swahili (macrolanguage) 24,097 5 145 1
Swedish 431,034 426 2,087 86
Tagalog 90,465 98 1,093 13
Tamil 3,051 4 108 1
Telugu 64 0 2 0
Thai 95,833 2,155 4,062 708
Turkish 869,200 986 7,456 516
Ukrainian 508,773 1,287 8,114 585
Urdu 2,608 0 4 0
Vietnamese 164,752 159 1,537 88
Welsh 42,970 8 152 2
NA 26,850 2 30 0

This graph only shows the relative number of publications per year to identify different trends.

Show the code
readRDS(file.path(params$corpus, "st_languages.rds")) |>
  # keep top 15 languages by total (before scaling)
  dplyr::mutate(
    total = count_openalex + count_spc + count_nature + count_spcc
  ) |>
  dplyr::slice_max(total, n = 15) |>
  dplyr::arrange(dplyr::desc(total)) |>
  # fix display order so largest stays on top
  dplyr::mutate(language = factor(language, levels = rev(language))) |>
  dplyr::select(-total) |>
  # reshape wide → long
  tidyr::pivot_longer(
    cols = dplyr::starts_with("count_"),
    names_to = "source",
    values_to = "count",
    names_prefix = "count_"
  ) |>
  # scale so each source sums to 1
  dplyr::group_by(source) |>
  dplyr::mutate(
    total_source = base::sum(count, na.rm = TRUE),
    count = dplyr::if_else(total_source > 0, count / total_source, 0)
  ) |>
  dplyr::ungroup() |>
  dplyr::select(-total_source) |>
  ggplot2::ggplot(ggplot2::aes(x = language, y = count, fill = source)) +
  ggplot2::geom_col(position = "dodge") +
  ggplot2::coord_flip() +
  ggplot2::scale_y_continuous(
    labels = scales::label_percent(accuracy = 1),
    expand = ggplot2::expansion(mult = c(0, 0.05))
  ) +
  ggplot2::labs(
    x = "Language",
    y = "Share of total works within each source",
    fill = "Source",
    title = "Publications by language (top 15), scaled so each source sums to 1"
  ) +
  ggplot2::theme_minimal(base_size = 14) +
  ggplot2::theme(
    legend.position = "bottom",
    panel.grid.minor = ggplot2::element_blank()
  )

Individual Chapter

Here we show the sub-searches for the individual chapters. In the tables indicating the number, an NA value indicates that the search string was to long (most likely) or any other error occured in the search. The same applies when an error message is given.

Chapter 1

Show the code
readRDS(file.path(params$chapter_1, "st_hits.rds")) |>
  base::format(big.mark = ",") |>
  knitr::kable(
    col.names = c("Count"),
    align = "r"
  )
Count
Set 1 3
Set 2 271
Set 3 10
Set 4 6
Set 5 154
Set 6 1,431
Set 7 0

Chapter 2

Show the code
readRDS(file.path(params$chapter_2, "st_hits.rds")) |>
  base::format(big.mark = ",") |>
  knitr::kable(
    col.names = c("Count"),
    align = "r"
  )
Count
GBF-1 - Urban 294,140
GBF-1 - Rural 407,028
GBF-1 - Freshwater 580,040
GBF-1 - Marine 213,588
GBF - 2 (Ecosystem restoration) 830,296
Target 3 (Protected areas / conservation coverage) 420,299
Target 4 (Species extinction & genetic diversity) 32,890
Target 5 (Wild species trade & use) 67,552
Target 6 (Invasive alien species) 10,739
Target 7 (Pollution) 146,016
Target 8 (Climate change & resilience) 173,280
Target 9 (Wild species management & use) 7,551
Target 10 (Sustainability in agriculture, aquaculture, forestry & fisheries) 200,942
Target 11 (Nature’s contributions to people / ecosystem services) 40,910
Target 12 (Green & blue spaces, urban planning) 52,306
Target 13 (Genetic resources & benefit sharing) 7,946
Target 14 (Biodiversity integration in decision-making) 110,668
Target 15 (Business & financial institutions disclosure & risk) 204,684
Target 16 (Sustainable consumption) 70,989
Target 17 (Biosafety) 8,726
Target 18 (Harmful incentives / subsidies) 35,507
Target 19 (Finance mobilisation) 72,421
Target 20 (Capacity building, technology & cooperation) 409,186
Target 21 (Data, knowledge & monitoring) 945,190
Target 22 (Participation & inclusion) 128,118
Target 23 (Gender equality) 60,367
Related to spatial planning process 99,427

Chapter 3

Show the code
readRDS(file.path(params$chapter_3, "st_hits.rds")) |>
  base::format(big.mark = ",") |>
  knitr::kable(
    col.names = c("Count"),
    align = "r"
  )
Count
Set 1 Error in api_request(query_url, ua, query = query_ls, api_key = api_key, :
HTTP status 400 Request Line is too large
Set 2 9847
Set 3 493
Set 4 1047
Set 5 430
Set 6 366
Set 7 476
Set 8 22
Set 9 2
Set 10 20

Chapter 4

Show the code
readRDS(file.path(params$chapter_4, "st_hits.rds")) |>
  base::format(big.mark = ",") |>
  knitr::kable(
    col.names = c("Count"),
    align = "r"
  )
Count
Set 1 1,126
Set 2 171
Set 3 4,921
Set 4 21,246
Set 5 283
Set 6 2,054
Set 7 0
Set 8 65,648

Chapter 5

Show the code
counts <- readRDS(file.path(params$chapter_5, "st_hits.rds"))

do.call(
  rbind,
  lapply(names(counts), function(sect_nm) {
    df <- counts[[sect_nm]]
    df$section <- sect_nm
    df$set <- rownames(df)
    rownames(df) <- NULL
    df[,
      c("section", "set", setdiff(names(df), c("section", "set"))),
      drop = FALSE
    ]
  })
) |>
  dplyr::mutate(
    count = base::format(count, big.mark = ",")
  ) |>
  knitr::kable(
    col.names = c("Section", "Set", "Count"),
    align = c("c", "c", "r")
  )
Section Set Count
Sections 1 and 2 Set 1 153,416
Sections 1 and 2 Set 2 51,571
Sections 1 and 2 Set 3 49,405
Sections 1 and 2 Set 4 303,520
Sections 1 and 2 Set 5 202,356
Section 3 Set 1 1,997
Section 3 Set 2 0
Section 3 Set 3 85
Section 4 Set 1 60,823
Section 4 Set 2 17,120
Section 4 Set 3 10,841
Section 5 Set 1 11,330
Section 5 Set 2 60,048
Section 5 Set 3 8,244
Section 5 Set 4 21,769
Section 6 Set 1 146
Section 6 Set 2 3,329
Section 6 Set 3 2,425
Section 6 Set 4 1,915
Cross-cutting sets Set 1 31,294
Cross-cutting sets Set 2 NA

Chapter 6

Show the code
readRDS(file.path(params$chapter_6, "st_hits.rds")) |>
  base::format(big.mark = ",") |>
  knitr::kable(
    col.names = c("Count"),
    align = "r"
  )
Count
Set 1 9,720
Set 2 0
Set 3 67,744
Set 4 0
Set 5 2,582
Set 6 0
Set 7 0
Set 8.1 246,944
Set 8.2 0
Set 9 47,168
Set 10 14,781

Reuse

Citation

BibTeX citation:
@report{krug,
  author = {Krug, Rainer M. and Bishop, Gabriella and Villasante,
    Sebastian},
  title = {Spatial {Planning} and {Connectivity} {Corpus} - {Technical}
    {Background} {Report}},
  doi = {10.5281/zenodo.XXXXX},
  langid = {en},
  abstract = {To Be added}
}
For attribution, please cite this work as:
Krug, Rainer M., Gabriella Bishop, and Sebastian Villasante. n.d. “Spatial Planning and Connectivity Corpus - Technical Background Report.” IPBES Spatial Planning and Connectivity Assessment. https://doi.org/10.5281/zenodo.XXXXX.